Active Directory

Identification avancée

Si votre réseau est un peu important, que vous avez à gérer de nombreux utilisateurs, il se peut que vous ayez déjà une base de donnée contenant des couples user / password quelque part. L'idée serait alors excellente de vouloir configurer squid pour qu'il identifie les utilisateurs depuis cette base. Les annuaires LDAP sont très souvent utilisés dans ce but, et squid dispose de ce qu'il faut pour y arriver.

Nous allons voir comment faite dans le cas d'un annuaire LDAP un peu particulier.

Utiliser Active Directory

Active Directory n'est autre, en effet, qu'un annuaire LDAP revu et compliqué (enrichi ?) par Microsoft. Il est utilisé dans les domaines Microsoft, entre autres choses, pour stocker la base de donnée des utilisateurs, permettant ainsi la gestion de leurs comptes de façon centralisée. Un protocole de type Kerberos est employé pour l'authentification de l'utilisateur lorsqu'il ouvre une session sur un hôte quelconque du domaine.

Les systèmes GNU/Linux disposent de tous les outils pour intégrer un hôte Linux à un domaine Microsoft. En effet, dans cette architecture, les hôtes disposent aussi d'un compte dans le domaine, ce dernier étant à rapprocher du concept de royaume (realm) de Kerberos.

Le pré requis sera donc d'intégrer notre proxy au domaine Microsoft. Une fois cette opération réalisée, il deviendra possible d'authentifier un utilisateur en s'appuyant sur Active Directory.

Nous arriverons à un mode de fonctionnement assez agréable, puisque les utilisateurs déjà authentifiés dans le domaine Microsoft n'auront pas besoin de se ré identifier pour être autorisés à passer le proxy. La procédure a été vérifiée sur des hôtes clients Windows XP, elle doit être également validée sur des hôtes clients Linux intégrés au domaine et dont les sessions des utilisateurs sont authentifiées par Actrive DIrectory, mais je ne l'ai pas expérimenté.

Procédure de configuration du serveur hôte de Squid

Intégration dans le domaine Microsoft

Il nous faut installer les utilitaires clients Kerberos 5, samba 3 et winbind :

apt-get install  krb5-user krb5-config samba-common samba winbind

Ne vous préoccupez pas trop de la configuration post installation, nous la reprendrons en tièrement par la suite.

Configuration du client Kerberos

N'étant pas spécialiste de kerberos, loin s'en faut, je me contenterai de vous donner une recette. Nous supposons que nous avons un domaine (Active Directory) qui dispose du nom domaine.mrs (et DOMAINE pour la compatibilité pré-2000) :

~# cat /etc/krb5.conf
[libdefaults]
        default_realm = DOMAINE.MRS
        dns_lookup_realm = false
        dns_lookup_kdc = false

[realms]
DOMAINE.MRS = {
         kdc = 192.168.0.1
         kdc = 192.168.0.2
        admin_server = 192.168.0.1
        default_domain = DOMAINE.MRS
}

[domain_realm]
        .domaine.mrs = DOMAINE.MRS
        domaine.mrs = DOMAINE.MRS

[logging]
        default = FILE:/var/log/krb5.log
        kdc = FILE:/var/log/krb5kdc.log
        admin-server = FILE:/var/log/krb5adm.log

[appdefaults]
        pam = {
                debug = false
                ticket_lifetime = 36000
                renew_lifetime = 36000
                forwardable = true
                krb4_convert = false
        }
  • les adresses IP indiquées par kdc dans le paragraphe [realms] correspondent à vos contrôleurs de domaine Microsoft (vous en avez bien deux, n'est-ce pas ?) ;
  • l'adresse IP indiquée par admin_server correspond au contrôleur « Maître d'opérations » (vous avez, n'est-ce pas, les 5 rôles « FSMO » attribués au même contrôleur ?).
Vérification

La commande « kinit » va permettre de vérifier que l'on peut obtenir un ticket kerberos pour un utilisateur du domaine ActiveDirectory :

# kinit -V machin@DOMAINE.MRS
Password for machin@DOMAINE.MRS: 
Authenticated to Kerberos v5

La commande « klist » permet de lister les tickets obtenus :

# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: machin@DOMAINE.MRS

Valid starting     Expires            Service principal
11/15/07 10:36:18  11/15/07 20:36:22  krbtgt/DOMAINE.MRS@DOMAINE.MRS
        renew until 11/15/07 20:36:18

Kerberos 4 ticket cache: /tmp/tkt0
klist: You have no tickets cached

machin@domaine.mrs a bien été authentifié et le ticket kerberos a bien été reçu.

Non ? Alors revoyez votre configuration parce qu'habituellement, ça fonctionne bien.

Configuration de samba

# cat /etc/samba/smb.conf
[global]

        workgroup = DOMAINE
        realm = DOMAINE.EME
        security = ADS
        password server = 192.168.0.1 192.168.0.2
        client use spnego = yes 
        client ntlmv2 auth = yes
        syslog = 0
        log file = /var/log/samba/log.%m
        max log size = 1000
        announce version = 4
        announce as = NT Workstation
        dns proxy = No
        idmap uid = 167771-335549
        idmap gid = 167771-335549
        winbind use default domain = Yes
        invalid users = root

  • Le workgroup correspond au nom « plat » du domaine Microsoft ;
  • le realm correspond au royaume Kerberos ;
  • la security = ADS (Active Directory Server) nécessite que la machine soit intégrée au domaine Microsoft et que le client kerberos soit installé et configuré, ce qui permettra d'utiliser ce protocole pour l'authentification des clients ;
  • les password server sont bien entendu les contrôleurs de domaine Microsoft.

Les autres paramètres sont sans doute de moindre importance. Plongez-vous dans la lecture du manuel de smb.conf pour avoir tous les détails sur les divers paramètres.

Configuration de winbind

Modifiez comme suit le fichier « /etc/nsswitch.conf » :

passwd:         compat winbind
group:          compat winbind
shadow:         compat
hosts:          files dns
networks:       files

protocols:      db files
services:       db files
ethers:         db files

rpc:            db files

netgroup:       nis

Relancez samba et winbind :

# invoke-rc.d winbind restart
Stopping the Winbind daemon: winbind.
Starting the Winbind daemon: winbind.
# invoke-rc.d samba restart
Stopping Samba daemons: nmbd smbd.
Starting Samba daemons: nmbd smbd.

Intégration au domaine

 net ads join -U <un login d'Administrateur du domaine> -S <adresse d'un contrôleur de domaine>

En principe, un message doit vous annoncer que l'opération s'est bien déroulée et vous devriez retrouver votre proxy dans les « computers » dans votre mmc de gestion de « Active Directory Users and Computers »

Vérification

La commande « wbinfo » doit vous permettre de vérifier que vous avez correctement accès aux listes des utilisateurs et des groupes du domaine ActiveDirectory :

# wbinfo -u
invité
machin
administrateur
...
# wbinfo -g
BUILTIN/administrators
BUILTIN/users
ordinateurs du domaine
utilisa. du domaine
propriétaires créateurs de la stratégie de groupe
administrateurs du schéma
contrôleurs de domaine
invités du domaine
éditeurs de certificats
...

A ce moment, vous avez tout ce qu'il faut pour que squid puisse par la suite identifier les utilisateurs depuis ActiveDirectory.

N'hésitez pas à relancer winbind et samba si besoin est.

Configuration de squid

La méthode « ntlm » décrite ici est obsolète depuis au moins Windows 2008 server. Préférez la méthode proposée dans le chapitre consacré à Kerberos.

Squid va devoir utiliser le module ntlm_auth. Ici, il faut savoir quelque chose de plutôt important : Il existe deux modules ntlm_auth, l'un fourni avec samba et l'autre avec squid.

Bien que portant le même nom, ils ne fonctionnent pas de la même manière. Dans l'état actuel de ma machine de test :

  • Samba: Version 3.0.28a ;
  • winbindd: Version 3.0.28a ;
  • Squid Cache: Version 3.0.STABLE4.

je n'ai pas trouvé de solution pour fonctionner avec le ntlm_auth fourni avec Squid.

Comme c'est celui qui vient avec samba qui est le mieux documenté, nous allons utiliser celui-ci.

Vérifions déjà de façon simple s'il est capable d'authentifier un utilisateur inscrit dans Active Directory :

# ntlm_auth --username=machin --password=epikoi
NT_STATUS_OK: Success (0x0)

Ça marche.

Bien entendu, dans Squid, ce sera un peu plus compliqué que ça. Nous devons ajouter dans squid.conf

auth_param ntlm program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp

Pour indiquer que nous utilisons une authentification ntlm avec le module /usr/bin/ntlm_auth (fourni par Samba) qui, lui même, utilisera le protocole squid-2.5-ntlmssp. Pourquoi squid-2.5-ntlmssp ? Il semble que rien n'ait changé depuis squid-2.5.

Comme ntlm_auth va être invoqué par l'utilisateur sous l'identité duquel squid est lancé (proxy pour Debian), il faudra que le répertoire /var/run/samba/winbindd_privileged soit accessible en lecture par l'utilisateur proxy. Voyons cela :

# ls -l /var/run/samba
total 604
...
drwxr-x--- 2 root winbindd_priv     17 mar 18 11:56 winbindd_privileged

Un moyen propre de résoudre le problème est d'ajouter l'utilisateur proxy au groupe winbindd_priv :

usermod -a -G winbindd_priv proxy 

Nous pouvons aussi ajouter ces lignes dans squid.conf

auth_param ntlm children 5
auth_param ntlm keep_alive on

Le nombre de processus peut être augmenté suivant le nombre d'utilisateurs qui passent par notre proxy.

Bien sûr, nous avons toujours l'ACL acl password proxy_auth REQUIRED ainsi que l'autorisation d'accès http_access allow LocalNet password.

Au final :

auth_param ntlm program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp
auth_param ntlm children 5
auth_param ntlm keep_alive on
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl to_localhost dst 127.0.0.0/8
acl SSL_ports port 443
acl Safe_ports port 80		# http
acl Safe_ports port 21		# ftp
acl Safe_ports port 443		# https
acl Safe_ports port 70		# gopher
acl Safe_ports port 210		# wais
acl Safe_ports port 1025-65535	# unregistered ports
acl Safe_ports port 280		# http-mgmt
acl Safe_ports port 488		# gss-http
acl Safe_ports port 591		# filemaker
acl Safe_ports port 777		# multiling http
acl CONNECT method CONNECT
acl LocalNet src 192.168.0.0/24

acl password proxy_auth REQUIRED

http_access allow manager localhost
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost

http_access allow LocalNet password

http_access deny all
icp_access allow all
http_port 3128
hierarchy_stoplist cgi-bin ?
access_log /var/log/squid3/access.log squid
acl QUERY urlpath_regex cgi-bin \?
cache deny QUERY
refresh_pattern ^ftp:		1440	20%	10080
refresh_pattern ^gopher:	1440	0%	1440
refresh_pattern .		0	20%	4320
icp_port 3130
coredump_dir /var/spool/squid3

Normalement, en relançant squid tout ceci devrait fonctionner.

Le client est un client du domaine

Si votre client est intégré au domaine et que l'utilisateur a donc ouvert une session authentifiée par un contrôleur de domaine, le navigateur (aussi bien IE que FireFox) devraient, s'ils sont configurés pour utiliser le proxy, envoyer automatiquement à Squid les informations nécessaires à l'authentification.

Autrement dit, l'utilisateur ne voit rien de particulier. L'administrateur, lui, verra dans les logs d'accès à Squid (/var/log/squid3/access.log) le nom de l'utilisateur qui a formulé les requêtes.

Le client n'est pas un client du domaine

Imaginons qu'un utilisateur ait le droit de connecter son portable sur votre réseau, mais que ce portable n'est pas intégré au domaine Windows. Dans ce cas, un accès à Squid amènera une fenêtre de demande d'authentification. L'utilisateur devra alors disposer d'un compte sur le domaine Microsoft et indiquer son nom d'utilisateur « complet » :

DOMAINE\machin

Dans notre exemple.

Dernière modification:: le 21/11/2014 à 10:16
   
 
Cette création est mise à disposition sous un contrat Creative Commons. Creative Commons License